package visitorPattern.computer

/**
 * 模拟计算机结构组成
 *
 * 通过定义访问者实体,对计算机的不同组成部分进行访问
 *
 *
 * 示例代码实现逻辑,把计算机的各个部件打印出来,并展示各自的属性
 *
 *
 * 访问者模式的缺点:
 * 1、具体元素对访问者公布细节，违反了迪米特原则。
 * 2、具体元素变更比较困难。
 * 3、违反了依赖倒置原则，依赖了具体类，没有依赖抽象。
 *
 *
 * 实际场景:在汽车启动的时候,车机系统会进行自检,会把车辆的每个部件模块检查一遍确保没问题才能
 * 启动车辆,对于此场景需求,首先需要访问的模块比较多,各模块的检查逻辑不尽相同,所以使用访问者模式可以
 * 降低耦合性,其次由于车辆出厂后自身模块功能增加的概率几乎为0,访问者模式的缺点在此场景都不成为缺点了,
 * 所以比较适合使用访问者模式
 */
fun main() {
    //创建一个访问者对象
    val computerPartPrint = ComputerPartPrint()

    //创建计算机实例
    val computer = Computer()
    //接收一个访问者,在accept方法中执行访问者的visit方法
    computer.accept(computerPartPrint)


}